
#1.实现1-100之和

a=list(range(1,101))  #生成1-100的列表
print(sum(a))

#2.列表去重并从大到小排序
b=[32,24,35,34,56,43,23,43,32,34];
B=set(b)   #转换成集合，自动去重
print(sorted(B))

author="黄欣怡"
#3.在函数内部修改全局变量
def modglb():
    global author
    author="huangxinyi";
modglb()
print(author)

#4.跨模块共享全局变量
from test1 import two   #绝对导入   #包的相对导入只能用from形式
two.autho="hjk"   #在two.py中定义了autho这个变量
print(two.autho)

#5.python数据类型：基本数据类型（数值[整数，浮点，复数，e]，字符，布尔），容器数据类型(列表，元组，字典，集合)

#6.python中生成随机整数（1-10），随机小数（1-10），0-1之间小数的方法
def f6():
    import random
    ZS=random.randint(1,10)   #生成随机整数
    XS=random.random()     #生成随机的0-1之间的小数
    SJXS=random.uniform(1,10)  #生成1-10之间的随机小数
#f6()

#7.python2和python3的区别：
#1.导入时不一样，python2默认以相对导入，python3默认以绝对导入
#2.输出：Python2  print “ab”或者是print(“ab”)  Python3  只能是print(“ab”)
#3.输入Python2 a=input(),a的类型默认是int，若输入“1”，则类型为str；输入1，则类型为int；输入ABC，则会报错；可用str=raw_input()来获得输入为str类型的值。Python3 a=input(),a的默认类型是str
#4.Python2：range（0,4）==[1,2,3,4],xrange(0,4)等同于python3中的range(0,4)   Python3: range(0,4)是一个迭代对象，需要用list(range(0,4))==[1,2,3,4]
#5.Python2中True可以改动如True=8，则True值为8   Python3中True被定义为关键字了，关键字是不能进行改动的，即不能进行更改和赋值操作

#8.python中哪些是可变数据类型，哪些是不可变数据类型
#不可变数据类型更改后地址发生改变，可变数据类型更改地址不发生改变
#不可变数据类型:整型，字符串，元组，
#可变数据类型:集合，列表，字典

#9.统计字符串中每个单词出现的次数
def f9():
    str=input("请输入字符串：")
    s=str.split();
    from collections import Counter   #引入计数器
    new_num = Counter(s)   #以类似于字典形式保存
    for i ,value in new_num.items():
        print('{}出现的次数是{}'.format(i,value))
#f9()


#10.Python实现，给定一个字符串，找到字符串中第一个重复的字符
def f10():
    a=input("请输入字符串：")
    import re
    ret=re.findall(r'.?',a)
    str="";
    for i in ret[:-1]:
        if i not in [" "]:
            str=str+i
    print(str)
    for i in range(len(str)):
        if str[i] in str[i+1:len(str)+1]:
            break;
    if i!=len(str)-1:
        print(str[i])
    else:
        print("没有重复字符")
#f10()
#11.什么是pep 8
# PEP全称为：Python Enhancement Proposal，一个PEP是一份文档，它描述了为Python提出的新特性以及为社区编写的Python方面的文档，比如设计和风格
#主要内容https://wenku.baidu.com/view/82a6d782482fb4daa48d4b98.html


#12.python里如何赋值、浅拷贝、深拷贝的区别
#赋值：只是将变量指向了原对象，其实就是对象的引用（别名）；
# 浅拷贝(copy)：copy 模块的 copy 方法，只拷贝父对象，不会拷贝对象的内部的子对象；
# 深拷贝(deepcopy)：copy 模块的 deepcopy 方法，完全拷贝了父对象及其子对象。

#13.简述python的内存管理机制
#1.引用计数机制  2.垃圾回收机制（a.分代回收  b.标记清除）3.内存池和缓冲区机制
#内存管理机制：引用计数、垃圾回收、内存池。
#引用计数：引用计数是一种非常高效的内存管理手段，当一个Python对象被引用时其引用计数增加1，当其不再被一个变量引用时则计数减1.当引用计数等于0时对象被删除。
#垃圾回收：1.引用计数引用计数也是一种垃圾收集机制，而且也是一种最直观，最简单的垃圾收集技术。当Python的某个对象的引用计数降为0时，说明没有任何引用指向该对象，该对象就成为要被回收的垃圾了。比如某个新建对象，它被分配给某个引用，对象的引用计数变为 1。如果引用被删除，对象的引用计数为 0，那么该对象就可以被垃圾回收。
#不过如果出现循环引用的话，引用计数机制就不再起有效的作用了
        # 2.标记清除如果两个对象的引用计数都为1，但是仅仅存在他们之间的循环引用，那么这两个对象都是需要被回收的，也就是说，它们的引用计数虽然表现为非 0，但实际上有效的引用计数为 0。所以先将循环引用摘掉，就会得出这两个对象的有效计数。
#3.分代回收从前面“标记-清除”这样的垃圾收集机制来看，这种垃圾收集机制所带来的额外操作实际上与系统中总的内存块的数量是相关的，当需要回收的内存块越多时，垃圾检测带来的额外操作就越多，而垃圾回收带来的额外操作就越少；反之，当需回收的内存块越少时，垃圾检测就将比垃圾回收带来更少的额外操作。


#14.重复接收用户输入的一个字符串，如果是正整数, 就输出结果，否则一直输入
def f14():
    import re
    a=input("请输入字符串:");
    #str=re.compile(r'^[1-9]\d*$').findall(a)
    while True:
        try:
            num=int(a);
            if num== abs(num):
                print("{}是正整数".format(a));
                break;
            else:
                a = input("请重新输入：");
        except Exception as f:
            a=input("输入有误，重新输入：",)
#f14()

#15.以左下三角的形式输出1~9乘法口诀
def f15():
    for i in range(1,10):
        for j in range(1,i+1):
            print("{}*{}={}".format(j,i,i*j),end='\t')
        print()
#f15()

#16.实现n个数的介乘
def f16():
    n=eval(input("请输入一个数字："))
    b=1
    for i in range(1,n+1):
        b*=i;
    print("{}的阶乘是{}".format(n,b))
#f16()

#17.给定一个列表如[1,2,3,4,5,6] ，指定任意一个数字如6 ，快速的计算出列表里哪两个数相加为6，若相加都不为6则输出提示。
def f17():
    n = eval(input("请输入一个数字："))
    li=[1,3,6,23,7,4,8,2,12];
    a=False;
    for i in li:
        if (n-i) in li:
            print("{}+{}={}".format(i,n-i,n))
            li.remove(i);  #为了不得到重复的输出
            a=True;
    if a==False:
        print("列表中没有相加等于{}的数据对".format(n))
#f17()

#18.打印出所有100到999的"水仙花数"，所谓"水仙花数"是指一个三位数，其各位数字立方和等于该数本身。例如：153是一个"水仙花数"，因为153=1的三次方＋5的三次方＋3的三次方。
def f18():
    for i in range(1,10):
        for j in range(0,10):
            for z in range(0,10):
                num=i*100+j*10+z
                if num==i**3+j**3+z**3:
                    print("{}是水仙花数".format(num))
#f18()

#19.用python实现冒泡排序(最后的元素应该会是最大的数)升序
def f19():
    li=input("请输入一个待比较的序列：").split()
    try:
        L=list(map(lambda x:int(x),li))
        for i in range(0,len(L)-1):   #比较趟数，需要比较n-1,
            max=L[0];
            for j in range(1,len(L)-i):  #每趟比较次数，n-1次
                if max>L[j]:
                    L[j-1],L[j]=L[j],L[j-1]  #进行互换
                max = L[j];
        print(L)
    except Exception as f:
        print("输入有误，请输入数字")
#f19()

#20.用python实现快速排序
def f(list, left, right):
    if left >= right:  #判断下标值
        return list

    jz = list[left]# 将左边第一位定位基准数，以此数将序列分为两部分
    min = left  #开始进行搜索
    max = right
    while left != right:
        while left < right :# 从最右边开始查，找到第一个比基准值小的数
            if list[right] >= jz:
                right -= 1
                list[left] = list[right]
            else:# 从最左边开始查，查找比基准值大的数
                left += 1
                list[right] = list[left]
        list[right] = jz
    #递归调用
    f(list, min, left - 1)
    f(list, left + 1, max)
    return list
def f20():
    li = input("请输入一个待比较的序列：").split()
    L = list(map(lambda x: int(x), li))
    print(L)
    Li=f(L,0,len(L)-1);
    print(Li)
#f20()